/**
 * \file   mm.h
 * \author Fabian Jesus Machado
 * \date   Septiembre de 2011
 * 
 *  Este archivo es parte del proyecto NPASM, un ensamblador para
 * microcontroladores PIC con sintaxis Intel, desarrollado inicialmente
 * por Fabian Machado (fabianjsm@gmail.com, twitter@fabianjsm).
 *  El codigo fuente esta diponible en el repositorio SVN de Google:
 *      http://npasm.googlecode.com/svn/trunk.
 * 
 */
#ifndef	MM_H
#define	MM_H
#include <ctype.h>
#include <vector>
#include "emitir.h"
#include "ts.h"
#define NULL_ROM   0xFFFF
#define NO_SECCION (-1)
#define RAM 0x01
#define ROM 0x02

class class_seccion { 
public:
	class_seccion(int, size_t, size_t);
	int  tipo;           /* ram, rom */
	size_t base;         /* direccion base */
	size_t maxp;         /* limite superior */
	size_t p;            /* puntero dentro de la seccion */
};

class mm: public class_seccion {
public:
	mm();
	~mm();
	
	void SetROM(unsigned short _op);
	void SetSeccion(int);
	std::vector<unsigned short> &GetVectorROM();
	void SetP(size_t);
	size_t GetP();
	void AvanzarP(size_t);
	void CargarLnk();
	void ReiniciarPunteros();
	void Alinear(size_t);

protected:
	std::vector<unsigned short> rom;
	friend void emitir_instr(linea_asm *l);
	
	void NuevaSeccion(std::string, class_seccion *);

private:
	int seccion;  /* seccion actual */
	std::vector<class_seccion, std::allocator<class_seccion> > vseccion; /* todas las secciones */
	
	/* lexico y sintaxis del archivo lnk */
	int get();
	void unget();
	int lexp;
};

#endif	/* MM_H */
